package com.ilxqx.framework.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.Temporal;
import java.util.Date;

/**
 * 时间工具类
 * @author venus
 */
public final class DateUtils {

	/**
	 * 获取当前的字符串日期
	 * @return 字符串日期
	 */
	public static String getStringCurDate () {
		return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
	}

	/**
	 * 获取当前的字符串日期时间
	 * @return 字符串日期时间
	 */
	public static String getStringCurDateTime () {
		return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
	}

	/**
	 * 获取字符串格式化后的日期时间
	 * @param date 日期对象
	 * @param pattern 格式
	 * @return 日期时间字符串
	 */
	public static String getStringFormattedDateTime (Date date, String pattern) {
		return getStringFormattedDateTime(dateToLocalDateTime(date), pattern);
	}

	/**
	 * 获取字符串格式化后的日期时间
	 * @param temporal 时间对象
	 * @param pattern 格式
	 * @return 日期时间字符串
	 */
	public static String getStringFormattedDateTime (Temporal temporal, String pattern) {
		if (temporal instanceof LocalDateTime) {
			return ((LocalDateTime) temporal).format(DateTimeFormatter.ofPattern(pattern));
		} else if (temporal instanceof LocalDate) {
			return ((LocalDate) temporal).format(DateTimeFormatter.ofPattern(pattern));
		} else if (temporal instanceof LocalTime) {
			return ((LocalTime) temporal).format(DateTimeFormatter.ofPattern(pattern));
		}
		return "";
	}

	/**
	 * 获取字符串日期
	 * @param date 日期对象
	 * @return 字符串日期
	 */
	public static String getStringDate (Date date) {
		return getStringFormattedDateTime(date, "yyyy-MM-dd");
	}

	/**
	 * 获取字符串日期时间
	 * @param date 日期对象
	 * @return 字符串日期
	 */
	public static String getStringDateTime(Date date) {
		return getStringFormattedDateTime(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 获取字符串日期时间
	 * @param localDateTime 日期对象
	 * @return 字符串日期
	 */
	public static String getStringDateTime(LocalDateTime localDateTime) {
		return getStringFormattedDateTime(localDateTime, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 获取字符串日期
	 * @param localDate 日期对象
	 * @return 字符串日期
	 */
	public static String getStringDate(LocalDate localDate) {
		return getStringFormattedDateTime(localDate, "yyyy-MM-dd");
	}

	/**
	 * 获取字符串时间
	 * @param localTime 本地时间对象
	 * @return 字符串时间
	 */
	public static String getStringTime(LocalTime localTime) {
		return getStringFormattedDateTime(localTime, "HH:mm:ss");
	}

	/**
	 * 本地日期时间转Date对象
	 * @param dateTime 日期时间对象
	 * @return Date对象
	 */
	public static Date localDateTimeToDate (LocalDateTime dateTime) {
		return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
	}

	/**
	 * Date转日期时间对象
	 * @param date Date对象
	 * @return 日期时间对象
	 */
	public static LocalDateTime dateToLocalDateTime (Date date) {
		return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
	}

	/**
	 * 解析为Date对象
	 * @param datetime 日期时间字符串
	 * @param pattern 格式
	 * @return Date对象
	 */
	public static Date parseDate (String datetime, String pattern) {
		return localDateTimeToDate(LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern(pattern)));
	}

	/**
	 * 解析为日期时间对象
	 * @param datetime 日期时间字符串
	 * @param pattern 格式
	 * @return 日期时间对象
	 */
	public static LocalDateTime parseLocalDateTime (String datetime, String pattern) {
		return LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern(pattern));
	}

	/**
	 * 解析为日期对象
	 * @param date 日期字符串
	 * @param pattern 格式
	 * @return 日期对象
	 */
	public static LocalDate parseLocalDate (String date, String pattern) {
		return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern));
	}

	/**
	 * 解析为时间对象
	 * @param time 时间字符串
	 * @param pattern 格式
	 * @return 时间对象
	 */
	public static LocalTime parseLocalTime (String time, String pattern) {
		return LocalTime.parse(time, DateTimeFormatter.ofPattern(pattern));
	}

	/**
	 * 获取unix时间戳
	 * @param milliseconds 毫秒
	 * @return unix时间戳，秒
	 */
	public static long getUnixTime(long milliseconds) {
		return milliseconds / 1000;
	}

}
